#include <iostream>
using namespace std;
int field[100][100];
// -1 - mine
// 0-8 - cell
int field_p[100][100];
// -2 - closed
// -1  - flag
// 0-8  - opened
const int N = 9, M = 9, K = 10;



void print_field()
{
	system("cls");
	cout << "  ";
	for (int i = 0; i < M; ++i)
	{
		cout << " " << i + 1;
		if (i + 1 < 10) cout << ' ';
	}
	cout << endl;
	for (int i = 0; i < N; i++)
	{

		cout << i + 1 << " ";
		if (i + 1 < 10) cout << ' ';

		for (int j = 0; j < M; j++) {
			if (field_p[i][j] == -2) cout << "_  ";
			else if (field_p[i][j] == -1) cout << "f  ";
			else if (field_p[i][j] == -3) cout << "*  ";
			else cout << field_p[i][j] << "  ";
		}
		cout << endl;
	}
	cout << endl << endl << endl;
}



void dfs(int x, int y) {
	if (x < 0 || x >= N || y < 0 || y >= M || field_p[x][y] > -2) return;
	field_p[x][y] = field[x][y];
	if (field[x][y] > 0) return;
	for (int i2 = x - 1; i2 <= x + 1; ++i2) {
		for (int j2 = y - 1; j2 <= y + 1; ++j2) {
			if (i2 != x || j2 != y) dfs(i2, j2);
		}
	}
}




// истина - не взорвались на бомбе
//задаем тип boolean, так как у нас условия зависят от того, правда это или нет
//часть кода с bool будет определять, сколько бомб находится вокруг открытой клетки
//смотрим, не взорв.



bool open_cell(int x, int y)
{
	if (field[x][y] == -1) return false;
	if (field[x][y] > 0) {
		field_p[x][y] = field[x][y];
		return true;
	}
	dfs(x, y);
}


//смотрим: случай выигрыша
bool is_win() {
	int opened = 0;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			if (field_p[i][j] >= 0) opened++; //0 1 2 3
		}
	}
	return (N * M - K == opened); //9*9-10
}


//сучай проигрыша (бум-бум)
void end_game(bool is_win = false)
{
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			if (field_p[i][j] == -1) field_p[i][j] = -2;
			if (field[i][j] == -1) field_p[i][j] = -3;
		}
	}
	print_field();
	//в зависимости от результата у нас на экране появится надпись
	cout << "You " << (is_win ? "win" : "lost") << ",\nwanna start new game?:\n";
	string s;
	cin >> s;
}
//1сл - мы взорвались
//2сл - мы живы и закончились клетки
//3сл - мы играли мы играли и случайно на мину упали


int main()
{
	while (true) //если мы пока не наступили на бомбу и открыли хорошую клетку, то выполняем следующие условия
	{
		srand(time(0)); //расстановка бомб будет менять 
		for (int i = 0; i < N; i++)
		{
			for (int j = 0; j < M; j++) {
				field[i][j] = 0;
				field_p[i][j] = -2;
			}
		}
		for (int i = 0; i < K; ++i) { //кол-во бомб
			while (true) {
				int x = rand() % N; //рандомное значение
				int y = rand() % M;
				if (field[x][y] != -1)
				{
					field[x][y] = -1;
					break;
				}
			}
		}
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				if (field[i][j] != -1) {
					field[i][j] = 0;
					for (int i2 = i - 1; i2 <= i + 1; ++i2) {
						for (int j2 = j - 1; j2 <= j + 1; ++j2) {
							if (i2 >= 0 && i2 < N && j2 >= 0 && j2 <= M &&
								field[i2][j2] == -1) ++field[i][j];
						}
					}
				}
			}
		}
		while (true) {
			print_field();
			cout << "Enter comand:";
			/*
			\o x y
			\f x y
			\n
			\q
			*/
			string comand;
			cin >> comand;
			if (comand == "\\o") {
				// при указании команды "открыть" задаем возможность выбора координат, т.е. клеточки, которую
				//хотим открыть 
				int x, y;
				cin >> x >> y;
				--x; --y;
				// открываем клетки
				if (x < 0 || x >= N || y < 0 || y >= M || field_p[x][y] >= 0) continue;
				if (!open_cell(x, y)) {
					end_game();
					break;
				}
				if (is_win()) {
					end_game(true);
					break;
				}
			}
			else if (comand == "\\f") {
				// вводим координаты
				int x, y;
				cin >> x >> y;
				--x; --y;
				if (x < 0 || x >= N || y < 0 || y >= M || field_p[x][y] >= 0) continue;
				// ставим флажок
				if (field_p[x][y] == -1) field_p[x][y] = -2;
				else field_p[x][y] = -1;
			}
			else if (comand == "\\n") {
				break;
			}
			else if (comand == "\\q") {
				return 0;
			}
		}
	}
}
